# encoding:utf-8
import os
import re
import pytest
from utils.file_handling.ini_handling import LoadIni
from config.global_variable import TMPLIST, ENV_DICT, EXCEL_DICT, AI_XIAOWU
from config.all_paths import result_txt_path, config_variable_path, get_root_path, result_excel_path, ai_report
from utils.file_handling.txt_handling import write_txt, delete_txt, truncate_txt, txtIsEmpty, read_txt_handel
from utils.others_tool.other_tool import del_report, del_logs
from utils.file_handling.excel_handling import ExcelUtil, write_data_to_excel
from utils.interface_auth.auth_tool import Authentication


def pytest_collection_modifyitems(items):
    # 处理控制台打印乱码的问题
    # 测试用例收集完成时，将收集到的 item 的 name 和 node_id 的中文显示在控制台上
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode-escape")
        item._nodeid = item._nodeid.encode("utf-8").decode("unicode-escape")
        # item._nodeid = item.nodeid.encode("utf-8").decode("unicode-escape")


def pytest_addoption(parser):
    """
    添加自定义命令行参数，详情可参考 https://blog.csdn.net/mashang_z111/article/details/127350428
    parser.addoption为固定写法
    default 设置一个默认值，此处设置默认值为test
    choices 参数范围，传入其他值无效
    help 帮助信息
    """
    parser.addoption(
        "--env", default="test_wt",
        choices=["test_wt", "pro_wt","test_supda", "pro_supda", "test_weight","pro_weight",
                 "test_internet_hos", "pro_internet_hos", "test_TH", "pro_TH"],
        help="环境参数"
    )
    parser.addoption(
        "--role", default="doctor",
        choices=["assistant", "manage-assistant", "doctor", "admin", "dietitian",
                 "dietitian_manager", "PlatformOperation", 'admin', 'centre_manage','manage-centre'],
        help="角色参数"
    )


# 获取自定义参数-环境参数
@pytest.fixture(scope="session", autouse=True)
def get_env(request):
    return request.config.getoption("--env")


# 获取平台参数
@pytest.fixture(scope="session", autouse=True)
def get_role(request):
    return request.config.getoption("--role")


@pytest.hookimpl(hookwrapper=True, tryfirst=True)
def pytest_runtest_makereport(item, call):
    print('------------------------------------')
    # 获取钩子方法的调用结果
    out = yield
    # print('用例执行结果', out)
    # 从钩子方法的调用结果中获取测试报告
    report = out.get_result()
    if report.when == "call":
        print('测试报告：%s' % report)
        print('步骤：%s' % report.when)
        print('nodeid：%s' % report.nodeid)
        print('description:%s' % str(item.function.__doc__))
        print(('运行结果: %s' % report.outcome))


# AI统计项目才用这个夹具
@pytest.fixture(scope="session")
def fix_AI():
    print("开始执行AI统计")
    yield
    print("\n用例运行后置操作：将统计结果写入ai_report")
    write_data_to_excel(AI_XIAOWU, ai_report)


@pytest.fixture(scope='session', autouse=True)
def my_fixture():
    print("用例运行前置操作：")
    print("1.清空run_result文件夹中的记录")
    delete_txt(result_txt_path)  # 直接删除txt文件
    print("2.清除旧日志文件")
    del_logs()  # 保留最新的9份
    print("3.清除旧测试报告文件")
    del_report()  # 保留最新的9份
    print("4.清空变量文件variable")
    truncate_txt(config_variable_path)  # 清空文件
    yield
    print("用例运行后置操作：")
    print('1.打印临时存储列表：', TMPLIST)
    print('2.将执行的结果回写到excel文件中')
    text_files = txtIsEmpty(result_txt_path)
    print('3.打印返回的文件列表：', text_files)
    if text_files:
        wirteResultToExcel(text_files)


#
def wirteResultToExcel(text_files):
    '''
    将执行结果写入excel表格
    :param text_files: 需要写入的文本文件列表
    '''
    for text_file in text_files:
        fileName = ''
        if text_file.find("\\") > -1:
            fileName = text_file.split('\\')[-1].split('.')[0]  # 清洗后的文件名
        if text_file.find("/") > -1:
            fileName = text_file.split('/')[-1].split('.')[0]  # 清洗后的文件名
        path = os.path.join(result_excel_path, fileName + '.xlsx')  # 最终写入的文件名称
        print('打印最终的写入路径', path)

        temList = read_txt_handel(text_file)  # 读取的txt返回的列表字典[{},{},]
        writeDict = {}
        for value in temList:
            data = []
            row = int(re.findall('\d+', value['id'])[0]) + 1
            data.append(value['excute_response'])
            data.append(value['excute_result'])
            writeDict[row] = data
            print(EXCEL_DICT)
            ExcelUtil(os.path.join(get_root_path(), EXCEL_DICT[fileName])).write_excel(writeDict, path)


@pytest.fixture(scope="session", autouse=True)
def get_config(get_env, get_role):
    print('当前运行环境：', get_env)
    print('当前角色：', get_role)
    if get_env == 'test_wt':
        ENV_DICT.update(LoadIni("test_wutong.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("test_wutong.ini").getSection('url'))
    elif get_env == 'pro_wt':
        ENV_DICT.update(LoadIni("pro_wutong.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("pro_wutong.ini").getSection('url'))
    elif get_env == 'test_supda':
        ENV_DICT.update(LoadIni("test_supda.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("test_supda.ini").getSection('url'))
    elif get_env == 'pro_supda':
        ENV_DICT.update(LoadIni("pro_supda.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("pro_supda.ini").getSection('url'))
    elif get_env == 'test_weight':
        ENV_DICT.update(LoadIni("test_weight.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("test_weight.ini").getSection('url'))
    elif get_env == 'pro_weight':
        ENV_DICT.update(LoadIni("pro_weight.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("pro_weight.ini").getSection('url'))
    elif get_env == 'test_internet_hos':
        ENV_DICT.update(LoadIni("test_internet_hos.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("test_internet_hos.ini").getSection('url'))
    elif get_env == 'pro_internet_hos':
        ENV_DICT.update(LoadIni("pro_internet_hos.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("pro_internet_hos.ini").getSection('url'))
    elif get_env == 'test_TH':
        ENV_DICT.update(LoadIni("test_TH.ini").getSection(get_role))
        ENV_DICT.update(LoadIni("test_TH.ini").getSection('url'))
    else:
        print("请输入正确的环境参数")



# 获取任意环境的参数
def getAnyTestSessionFromini(ini_name, role_name):
    env_dict = LoadIni(ini_name).getSection(role_name)
    env_dict.update(LoadIni(ini_name).getSection('url'))
    return Authentication(env_dict.get('username'),
                          env_dict.get('password'),
                          env_dict.get('url'),
                          ).auth_wutong()


# 处理测试数据
def dealTestDada(excelName):
    testData = ExcelUtil(os.path.join(get_root_path(), excelName)).read_excel()
    EXCEL_DICT[excelName.split('.')[0].split('/')[-1]] = excelName
    return testData
